package cn.zhj.base.mvp.ui.base

import cn.zhj.mvpart.mvp.BasePresenter
import cn.zhj.mvpart.mvp.IModel
import cn.zhj.mvpart.mvp.IView
import kotlinx.coroutines.*
import kotlin.coroutines.CoroutineContext

abstract class BaseMoulePresenter<M: IModel, V: IView> : BasePresenter<M,V>(), CoroutineScope {
    lateinit var job: Job
    // CoroutineScope 的实现
    override val coroutineContext: CoroutineContext
        get() = Dispatchers.Main + job

    override fun onCreate(view: IView) {
        super.onCreate(view)
        job = Job()
    }

    override fun onDestroy() {
        super.onDestroy()
        // 当 Activity 销毁的时候取消该 Scope 管理的 job。
        // 这样在该 Scope 内创建的子 Coroutine 都会被自动的取消。
        job.cancel()
    }

    /**
     * 上下文为当前activity上下文环境
     * 当前的上下文是Dispatchers.Main + job
     * 所以该协程 开始是运行在主进程的
     *
     * default表示立即开始协程
     *
     */
    fun launch(
        start: CoroutineStart = CoroutineStart.DEFAULT,
        block: suspend CoroutineScope.() -> Unit
    ): Job {
        return this.launch(coroutineContext, start, block)
    }

}